Save elfnotes in VM sxpr under image/notes, and load them on restore.
authorkfraser@localhost.localdomain <kfraser@localhost.localdomain>
Mon, 26 Feb 2007 09:59:56 +0000 (09:59 +0000)
committerkfraser@localhost.localdomain <kfraser@localhost.localdomain>
Mon, 26 Feb 2007 09:59:56 +0000 (09:59 +0000)
Signed-off-by: Brendan Cully <brendan@cs.ubc.ca>
tools/python/xen/xend/XendConfig.py
tools/python/xen/xend/XendDomainInfo.py

index fa19165e7724b0b30ca649b54c36288892f5ee1e..ec8a66fb7e968164037468da89653b29151ec1b2 100644 (file)
@@ -729,6 +729,10 @@ class XendConfig(dict):
                 image['hvm'] = image_hvm
                 image['hvm']['devices'] = image_hvm_devices
 
+            notes = sxp.children(image_sxp, 'notes')
+            if notes:
+                image['notes'] = self.notes_from_sxp(notes[0])
+
             self['image'] = image
 
             for apikey, imgkey in XENAPI_HVM_CFG.items():
@@ -1363,6 +1367,9 @@ class XendConfig(dict):
                             
                     image.append([arg, val])
 
+        if 'notes' in self['image']:
+            image.append(self.notes_sxp(self['image']['notes']))
+
         return image
 
     def update_with_image_sxp(self, image_sxp, bootloader = False):
@@ -1420,6 +1427,10 @@ class XendConfig(dict):
             image['hvm'] = image_hvm
             image['hvm']['devices'] = image_hvm_devices
 
+        notes = sxp.children(image_sxp, 'notes')
+        if notes:
+            image['notes'] = self.notes_from_sxp(notes[0])
+
         self['image'] = image
 
         for apikey, imgkey in XENAPI_HVM_CFG.items():
@@ -1432,7 +1443,28 @@ class XendConfig(dict):
                     self[apikey] = val
         self._hvm_boot_params_from_sxp(image_sxp)
 
+    def set_notes(self, notes):
+        'Add parsed elfnotes to image'
+        self['image']['notes'] = notes
 
+    def get_notes(self):
+        try:
+            return self['image']['notes'] or {}
+        except KeyError:
+            return {}
+
+    def notes_from_sxp(self, nsxp):
+        notes = {}
+        for note in sxp.children(nsxp):
+            notes[note[0]] = note[1]
+        return notes
+
+    def notes_sxp(self, notes):
+        nsxp = ['notes']
+        for k, v in notes.iteritems():
+            nsxp.append([k, str(v)])
+        return nsxp
+        
     def _hvm_boot_params_from_sxp(self, image_sxp):
         boot = sxp.child_value(image_sxp, 'boot', None)
         if boot is not None:
index c0678b21edf2d320e4807aeddba35e666b761ab8..9548e5558693baeda8e5206d973737c23adbe852 100644 (file)
@@ -356,7 +356,6 @@ class XendDomainInfo:
         self.store_mfn = None
         self.console_port = None
         self.console_mfn = None
-        self.notes = {}
 
         self.vmWatch = None
         self.shutdownWatch = None
@@ -790,7 +789,7 @@ class XendDomainInfo:
         f('store/ring-ref',   self.store_mfn)
 
         # elfnotes
-        for n, v in self.notes.iteritems():
+        for n, v in self.info.get_notes().iteritems():
             n = n.lower().replace('_', '-')
             if n == 'features':
                 for v in v.split('|'):
@@ -1482,7 +1481,7 @@ class XendDomainInfo:
             if 'console_mfn' in channel_details:
                 self.console_mfn = channel_details['console_mfn']
             if 'notes' in channel_details:
-                self.notes = channel_details['notes']
+                self.info.set_notes(channel_details['notes'])
 
             self._introduceDomain()